#include "types.h"
#include "uart.h"
#include "defs.h"
#include "param.h"

// 简单的控制台输出
void console_putc(char c) {
    uart_putc(c);
}

void console_puts(const char *s) {
    uart_puts(s);
}

void console_write(const char *buf, int n) {
    for (int i = 0; i < n; i++) {
        console_putc(buf[i]);
    }
}

// 读取一行输入（简单的行编辑）
void console_readline(char *buf, int max_len) {
    int pos = 0;
    char c;
    
    while (1) {
        c = uart_getc();
        
        // 回车键结束输入
        if (c == '\r' || c == '\n') {
            console_putc('\n');
            buf[pos] = '\0';
            return;
        }
        
        // 退格键处理
        if (c == '\b' || c == 127) {
            if (pos > 0) {
                pos--;
                console_puts("\b \b");  // 回退、空格、再回退
            }
            continue;
        }
        
        // 普通字符
        if (pos < max_len - 1 && c >= 32 && c <= 126) {
            buf[pos++] = c;
            console_putc(c);
        }
    }
}

// 控制台输出（带颜色支持）
void cprintf(const char* fmt, ...) {
    // 这里需要实现：
    // 1. 变参解析 (va_list)
    // 2. 格式化字符串处理
    // 3. 字符输出到控制台设备
    
    // 简化实现示例：
    volatile unsigned int* uart_tx = (unsigned int*)0x10000000; // UART地址
    const char* p = fmt;
    
    while (*p) {
        *uart_tx = *p++; // 输出字符到UART
    }
}

// 内核恐慌处理
void panic(const char* s) {
    cprintf("kernel panic: %s\n", s);
    
    // 禁用中断并进入无限循环
    asm volatile("csrc sstatus, %0" : : "r"(0x8)); // 清除SIE位
    for(;;) {
        asm volatile("wfi"); // 等待中断
    }
}